home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / prog / word.arj / MUNCH.C < prev    next >
C/C++ Source or Header  |  1993-01-28  |  11KB  |  439 lines

  1. #include <dos.h>
  2. #include <alloc.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <wgt.h>
  6. #include <scroll.h>
  7. #include <time.h>
  8.  
  9. // Demonstrates timing control
  10.  
  11. #define YOU 37
  12. void checkfeet(void);
  13. void checkhead(void);
  14. void checkright(void);
  15. void checkleft(void);
  16. void findelevators(void);
  17. void upelev(void);
  18. void downelev(void);
  19. void checkelevators(void);
  20. void moveguys(void);
  21.  
  22. int ox,oy,dir,anim;
  23. int jumping,addy;
  24. int spx,spy;
  25.  
  26. // 4 TIME structures to hold different info
  27. time_t tim1,tim2,tim3,tim4;
  28. // The number of times the screen is updated
  29. long updates;
  30.  
  31. int feet1,feet2,head1,head2;
  32. int windx,windy;
  33.  
  34. wgtmap mymap;            // our world map
  35.  
  36. int kbdon[100]={0,0,0,0,0,0};    // our keyboard on/off array;
  37. int kbdscanlist[100]={72,80,75,77,1,29};    // our keyboard scan codes;
  38. // You must have the above two if you want the keyboard interrupt 
  39.  
  40. color palette[256];        // our palette of colours
  41.  
  42. block blocks[1001];        // our blocks for the map
  43. block sprites[1001];        // our sprites 
  44.  
  45. int i;
  46.  
  47. typedef struct {
  48.     int curheight;
  49.     int origy,origx;
  50.     int timer;
  51.     } elevator;
  52.  
  53. int replace[200];
  54. int elevup=-1;
  55.  
  56.  
  57. elevator elev[30];
  58. int numelev=0;
  59.  
  60. void main(void)
  61. {
  62. printf("Wordup Graphics Toolkit     4-WAY SCROLLING DEMO\n");
  63. printf("Copyright 1992 WordUp Software Productions\n\n");
  64. printf("Arrow keys move, CTRL jumps. Up/down looks in direction or operates\n");
  65. printf("elevators.\n\nWindow Width (2-17):");
  66. scanf("%i",&windx);
  67. printf("\nWindow Height (2-10):");
  68. scanf("%i",&windy);
  69.  
  70. vga256();                    // init
  71. wloadsprites(&palette,"munchmap.spr",blocks);        // load blocks
  72. wloadsprites(&palette,"munchkin.spr",sprites);        // load sprites
  73.  
  74. mymap=wloadmap("mun.wmp");        // load our world map
  75.  
  76. findelevators();
  77.  
  78. winitscroll(windx,windy);    
  79.  
  80. wnormscreen();                    // go back to normal screen
  81. wcls(0);                    // clear it
  82.  
  83. wshowwindow(0,10,mymap);            // start looking at world
  84.                         // at 0,0
  85. installkbd();                    // start new keyboard interrupt
  86. numsprites=40;
  87. wobject[YOU].on=1; wobject[YOU].x=16; wobject[YOU].y=242; wobject[YOU].num=1;
  88.  
  89. jumping=0; addy=0;
  90. anim=2;
  91.  
  92. gettime(&tim1);
  93. // get beginning time
  94. window(1,1,80,25);
  95. do
  96. {
  97. gettime(&tim3);
  98. // used to store time needed for one frame
  99.  
  100. spx=0;
  101. spy=0;
  102. ox=wobject[YOU].x;
  103. oy=wobject[YOU].y;
  104.  
  105. if (jumping==1)
  106.   addy+=2;
  107. if (addy>15)
  108.    addy=15;
  109.  
  110. if ((kbdon[5]==1) & (jumping==0))
  111.    {
  112.    jumping=1;
  113.    addy=-14;
  114.    }
  115.  
  116. if (kbdon[2]==1)        // Pressing left
  117.   {
  118.   wobject[YOU].x-=8;
  119.   checkleft();
  120.   if (dir !=1)
  121.     {
  122.     dir=1;
  123.     anim=5;
  124.     }
  125.   anim++;
  126.   if (anim>8)
  127.     anim=5;
  128.   }
  129. else if (kbdon[3]==1)    // Pressing right
  130.   {
  131.   wobject[YOU].x+=8;
  132.   checkright();
  133.   if (dir !=2)
  134.     {
  135.     dir=2;
  136.     anim=1;
  137.     }
  138.   anim++;
  139.   if (anim>4)
  140.     anim=1;
  141.   }
  142.  
  143. wobject[YOU].num=anim;
  144. if (wobject[YOU].x==ox)
  145.   if (dir==1)
  146.      wobject[YOU].num=9;
  147.   else wobject[YOU].num=1;
  148.  
  149. wobject[YOU].y+=addy;
  150. if (wobject[YOU].y<0) wobject[YOU].y=0;
  151. if (addy<0)
  152.    checkhead();
  153.  
  154.  
  155. if ((jumping==1))
  156.   if (dir==1)
  157.      wobject[YOU].num=6;
  158.   else wobject[YOU].num=2;
  159.  
  160.  checkfeet();
  161.  
  162. spx=wobject[YOU].x-worldx-windowmaxx/2;
  163. spy=wobject[YOU].y-worldy-windowmaxy/2;
  164.  
  165. if (kbdon[0]==1)        // Pressing up
  166.   {
  167.   if ((feet1==105) | (feet2==105))
  168.      upelev();
  169.   else
  170.      spy=-4;
  171.   }
  172. if (kbdon[1]==1)    // Pressing down
  173.   {
  174.   if ((feet1==105) | (feet2==105))
  175.      downelev();
  176.   else
  177.      spy=+4;
  178.  }
  179.  
  180. checkelevators(); // make sure they come back down when not standing on them
  181.  
  182.  
  183. moveguys();
  184.  
  185.  
  186. wscrollwindow(spx,spy,mymap);    // update the scrolling window
  187. wshowobjects();
  188.  
  189. wcopyscroll(30,10);
  190. nosound();
  191. updates++;
  192. gotoxy(1,23); printf("%i",updates);
  193. // Run once, to find out the frame rate. Now take the milliseconds
  194. // per frame value, and put it in the while statement. Unremark this
  195. // while statement, and give it a try using a smaller scrolling window.
  196. // It should run at the same speed regardless of the window size.
  197. // Of course if it is a larger window, it will be slower than you want it.
  198. /*do {
  199.    gettime(&tim4);
  200.    } while (wtimer(tim3,tim4)<5);*/ 
  201. // Each frame takes at least 5 milliseconds right now. Raise and lower
  202. // the number to change the speed of the game.
  203.  
  204. } while (kbdon[4] !=1);            // until right button is pressed
  205. gettime(&tim2);
  206. // get final time
  207.  
  208. uninstallkbd();
  209.  
  210. wendscroll();
  211. wfreesprites(blocks);
  212. wfreesprites(sprites);
  213. wfreemap(mymap);
  214. textmode(C80);
  215. printf("\n# seconds: %d",wtimer(tim1,tim2)/100);
  216. printf("\n# ms: %i",wtimer(tim1,tim2));
  217. printf("\n# updates: %i",updates);
  218.  
  219.  
  220. printf("\nAverage frame rate: %2.2f frames/sec",(float)updates/(float)(wtimer(tim1,tim2)/100));
  221. printf("\nMilliseconds per frame: %2.2f ms/f",wtimer(tim1,tim2)/(float)updates);
  222. printf("\nRemember this-------------^");
  223. // now that you now this, you can delete all uses of tim1, and tim2
  224. // and only use tim3,tim4 to control timing. Try it!
  225.  
  226. getch();
  227. }
  228.  
  229.  
  230. void checkright(void)
  231. {
  232. int j,k,l;
  233.  
  234.   j=wgetworldblock(wobject[YOU].x+16,wobject[YOU].y+1,mymap);
  235.   k=wgetworldblock(wobject[YOU].x+16,wobject[YOU].y+15,mymap);
  236.   if ((j>=100) | (k>=100))
  237.     {
  238.     j=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+1,mymap);
  239.     k=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+15,mymap);
  240.    while ((j>=100) | (k>=100)) {
  241.    wobject[YOU].x--;
  242.   j=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+1,mymap);
  243.   k=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+15,mymap);
  244.  
  245.    }
  246.    }
  247. }
  248.  
  249. void checkleft(void)
  250. {
  251. int j,k,l;
  252.  
  253.   j=wgetworldblock(wobject[YOU].x-1,wobject[YOU].y,mymap);
  254.   k=wgetworldblock(wobject[YOU].x-1,wobject[YOU].y+15,mymap);
  255.   if ((j>=100) | (k>=100))
  256.     {
  257.   j=wgetworldblock(wobject[YOU].x,wobject[YOU].y,mymap);
  258.   k=wgetworldblock(wobject[YOU].x,wobject[YOU].y+15,mymap);
  259.    while ((j>=100) | (k>=100)) {
  260.    wobject[YOU].x++;
  261.   j=wgetworldblock(wobject[YOU].x,wobject[YOU].y,mymap);
  262.   k=wgetworldblock(wobject[YOU].x,wobject[YOU].y+15,mymap);
  263.    }
  264.    }
  265. }
  266.  
  267. void checkfeet(void)
  268. {
  269. int j,k;
  270.  
  271.   feet1=wgetworldblock(wobject[YOU].x,wobject[YOU].y+16,mymap);
  272.   feet2=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+16,mymap);
  273.   if ((feet1<50) & (feet2<50))
  274.     jumping=1;
  275.     else {
  276.    jumping=0;
  277.    addy=0;
  278.    j=wgetworldblock(wobject[YOU].x,wobject[YOU].y+15,mymap);
  279.    k=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+15,mymap);
  280.    while ((j>=100) | (k>=100)) {
  281.    wobject[YOU].y--;
  282.    j=wgetworldblock(wobject[YOU].x,wobject[YOU].y+15,mymap);
  283.    k=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y+15,mymap);
  284.    }
  285.    }
  286. }
  287.  
  288. void checkhead(void)
  289. {
  290. int j,k;
  291.  
  292.   head1=wgetworldblock(wobject[YOU].x,wobject[YOU].y-1,mymap);
  293.   head2=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y-1,mymap);
  294.   if ((head1<50) & (head2<50))
  295.     jumping=1;
  296.     else {
  297.    jumping=0;
  298.    addy=0;
  299.    j=wgetworldblock(wobject[YOU].x,wobject[YOU].y,mymap);
  300.    k=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y,mymap);
  301.    while ((j>=100) | (k>=100)) {
  302.    wobject[YOU].y++;
  303.    j=wgetworldblock(wobject[YOU].x,wobject[YOU].y,mymap);
  304.    k=wgetworldblock(wobject[YOU].x+15,wobject[YOU].y,mymap);
  305.    }
  306.    }
  307. }
  308.  
  309. void findelevators(void)
  310. {
  311. int i,j,k;
  312. for (i=0; i<=mapheight; i++)
  313.   for (j=0; j<=mapwidth; j++)
  314.     {
  315.     k=wgetworldblock(j*16,i*16,mymap);
  316.     if (k==105)
  317.       {
  318.       elev[numelev].curheight=i;
  319.       elev[numelev].origx=j;
  320.       elev[numelev].origy=i;
  321.       elev[numelev].timer=0;
  322.  
  323.       for (k=0; k<200; k++)
  324.       replace[k]=0;
  325.       numelev++;
  326.     }
  327.     }
  328.   }
  329.  
  330. void upelev(void)
  331. {
  332. int ii,jj;
  333. for (ii=0; ii<numelev; ii++)
  334.  {
  335.  if ( (elev[ii].origx>=(wobject[YOU].x/16)-1)
  336.     & (elev[ii].curheight>=(wobject[YOU].y/16)-1)
  337.     & (elev[ii].origx<=(wobject[YOU].x/16)+1)
  338.     & (elev[ii].curheight<=(wobject[YOU].y/16)+1)
  339.     & ((elevup==-1) | (elevup==ii))
  340.     & (wobject[YOU].y>16))
  341.     {
  342.      checkhead();
  343.      if ((head1<50) & (head2<50))
  344.      {
  345.      replace[elev[ii].curheight-1]=wgetworldblock(elev[ii].origx*16,(elev[ii].curheight-1)*16,mymap);
  346.      wputworldblock(elev[ii].origx*16,elev[ii].curheight*16,104,mymap);
  347.      wputworldblock(elev[ii].origx*16,(elev[ii].curheight-1)*16,105,mymap);
  348.      elev[ii].curheight--;
  349.      elevup=ii;
  350.      wobject[YOU].y-=16;
  351.       elev[ii].timer=10;
  352.      }
  353.      }
  354.     }
  355. }
  356.  
  357. void downelev(void)
  358. {
  359. int ii,jj;
  360. for (ii=0; ii<numelev; ii++)
  361.  {
  362.  if ((elev[ii].origx>=(wobject[YOU].x/16)-1)
  363.     & (elev[ii].curheight>=(wobject[YOU].y/16)-1)
  364.     & (elev[ii].origx<=(wobject[YOU].x/16)+1)
  365.     & (elev[ii].curheight<=(wobject[YOU].y/16)+1)
  366.     & (elev[ii].curheight !=elev[ii].origy))
  367.     {
  368.      wputworldblock(elev[ii].origx*16,elev[ii].curheight*16,replace[elev[ii].curheight],mymap);
  369.      wputworldblock(elev[ii].origx*16,(elev[ii].curheight+1)*16,105,mymap);
  370.      elev[ii].curheight++;
  371.      if (elev[ii].curheight==elev[ii].origy)
  372.      elevup=-1;
  373.      wobject[YOU].y+=16;
  374.      elev[ii].timer=10;
  375.      }
  376.     }
  377. }
  378.  
  379. void checkelevators(void)
  380. {
  381. int ii;
  382.  
  383. for (ii=0; ii<numelev; ii++)
  384.   {
  385.   if ((elev[ii].curheight !=elev[ii].origy))
  386.   {
  387.   if (elev[ii].timer==0)
  388.   {
  389.      wputworldblock(elev[ii].origx*16,elev[ii].curheight*16,replace[elev[ii].curheight],mymap);
  390.      wputworldblock(elev[ii].origx*16,(elev[ii].curheight+1)*16,105,mymap);
  391.      elev[ii].curheight++;
  392.      if (elev[ii].curheight==elev[ii].origy)
  393.      elevup=-1;
  394.    elev[ii].timer=0;
  395.   }
  396.   else elev[ii].timer--;
  397.   }
  398. }
  399. }
  400.  
  401. void moveguys(void)
  402. {
  403. int j,k;
  404.  
  405. for (i=0; i<=36; i++)
  406.   {
  407.   if ((wobject[i].on==1) &                // sprite on
  408.       (sprites[wobject[i].num] !=NULL))        // sprite made
  409.     {
  410.     if ((wobject[i].x<worldx+windowmaxx) &        // and on the screen
  411.         (wobject[i].y<worldy+windowmaxy) &
  412.         (wobject[i].x+spritewidth[wobject[i].num]>worldx) &
  413.         (wobject[i].y+spriteheight[wobject[i].num]>worldy))
  414.         {
  415.         if (wobject[i].num<16)  // walking right
  416.            {
  417.            wobject[i].num++;
  418.            if (wobject[i].num>15) wobject[i].num=12; // walking animation loop
  419.            wobject[i].x+=3;
  420.            j=wgetworldblock(wobject[i].x+16,wobject[i].y+16,mymap);
  421.            k=wgetworldblock(wobject[i].x+16,wobject[i].y+8,mymap);
  422.            if ((j<50) | (k>=50)) wobject[i].num=16;
  423.            }
  424.         if (wobject[i].num>15)  // walking left
  425.            {
  426.            wobject[i].num++;
  427.            if (wobject[i].num>19) wobject[i].num=16; // walking animation loop
  428.            wobject[i].x-=3;
  429.            j=wgetworldblock(wobject[i].x,wobject[i].y+16,mymap);
  430.            k=wgetworldblock(wobject[i].x,wobject[i].y+8,mymap);
  431.            if ((j<50) | (k>=50)) wobject[i].num=12;
  432.            }
  433.  
  434.  
  435.  
  436.     }
  437.   }
  438.  }
  439. }